home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-12-08 | 28.6 KB | 746 lines | [TEXT/R*ch] |
- Path: bloom-beacon.mit.edu!gatech!howland.reston.ans.net!pipex!uunet!library.erc.clarkson.edu!sun.soe.clarkson.edu!cline
- From: cline@sun.soe.clarkson.edu (Marshall Cline)
- Newsgroups: comp.lang.c++
- Subject: C++ FAQ: posting #4/4
- Followup-To: comp.lang.c++
- Date: 14 Nov 1994 00:26:49 GMT
- Organization: Paradigm Shift, Inc (training/consulting/OOD/OOP/C++)
- Lines: 729
- Sender: cline@sun.soe.clarkson.edu
- Distribution: world
- Expires: +1 month
- Message-ID: <3a6as9$gd9@library.erc.clarkson.edu>
- Reply-To: cline@parashift.com (Marshall Cline)
- NNTP-Posting-Host: sun.soe.clarkson.edu
- Summary: Please read this before posting to comp.lang.c++
-
- comp.lang.c++ Frequently Asked Questions list (with answers, fortunately).
- Copyright (C) 1991-94 Marshall P. Cline, Ph.D.
- Posting 4 of 4.
- Posting #1 explains copying permissions, (no)warranty, table-of-contents, etc
-
- ==============================================================================
- SECTION 17: Linkage-to/relationship-with C
- ==============================================================================
-
- Q98: How can I call a C function "f(int,char,float)" from C++ code?
-
- Tell the C++ compiler that it is a C function:
- extern "C" void f(int,char,float);
-
- Be sure to include the full function prototype. A block of many C functions
- can be grouped via braces, as in:
-
- extern "C" {
- void* malloc(size_t);
- char* strcpy(char* dest, const char* src);
- int printf(const char* fmt, ...);
- }
-
- ==============================================================================
-
- Q99: How can I create a C++ function "f(int,char,float)" that is callable by
- my C code?
-
- The C++ compiler must know that "f(int,char,float)" is to be called by a C
- compiler using the same "extern C" construct detailed in the previous FAQ.
- Then you define the function in your C++ module:
-
- void f(int x, char y, float z)
- {
- //...
- }
-
- The "extern C" line tells the compiler that the external information sent to
- the linker should use C calling conventions and name mangling (e.g., preceded
- by a single underscore). Since name overloading isn't supported by C, you
- can't make several overloaded fns simultaneously callable by a C program.
-
- Caveats and implementation dependencies:
- * your "main()" should be compiled with your C++ compiler (for static init).
- * your C++ compiler should direct the linking process (for special libraries).
- * your C and C++ compilers may need to from same vendor (calling convention).
-
- ==============================================================================
-
- Q100: Why's the linker giving errors for C/C++ fns being called from C++/C
- fns?
-
- See the previous two FAQs on how to use "extern "C"."
-
- ==============================================================================
-
- Q101: How can I pass an object of a C++ class to/from a C function?
-
- Here's an example:
-
- /****** C/C++ header file: Fred.h ******/
- #ifdef __cplusplus /*"__cplusplus" is #defined if/only-if compiler is C++*/
- extern "C" {
- #endif
-
- #ifdef __STDC__
- extern void c_fn(struct Fred*); /* ANSI-C prototypes */
- extern struct Fred* cplusplus_callback_fn(struct Fred*);
- #else
- extern void c_fn(); /* K&R style */
- extern struct Fred* cplusplus_callback_fn();
- #endif
-
- #ifdef __cplusplus
- }
- #endif
-
- #ifdef __cplusplus
- class Fred {
- public:
- Fred();
- void wilma(int);
- private:
- int a_;
- };
- #endif
-
- "Fred.C" would be a C++ module:
-
- #include "Fred.h"
- Fred::Fred() : a_(0) { }
- void Fred::wilma(int a) : a_(a) { }
-
- Fred* cplusplus_callback_fn(Fred* fred)
- {
- fred->wilma(123);
- return fred;
- }
-
- "main.C" would be a C++ module:
-
- #include "Fred.h"
-
- int main()
- {
- Fred fred;
- c_fn(&fred);
- return 0;
- }
-
- "c-fn.c" would be a C module:
-
- #include "Fred.h"
- void c_fn(struct Fred* fred)
- {
- cplusplus_callback_fn(fred);
- }
-
- Passing ptrs to C++ objects to/from C fns will FAIL if you pass and get back
- something that isn't EXACTLY the same pointer. For example, DON'T pass a base
- class ptr and receive back a derived class ptr, since your C compiler won't
- understand the pointer conversions necessary to handle multiple and/or virtual
- inheritance.
-
- ==============================================================================
-
- Q102: Can my C function access data in an object of a C++ class?
-
- Sometimes.
-
- (First read the previous FAQ on passing C++ objects to/from C functions.)
-
- You can safely access a C++ object's data from a C function if the C++ class:
- * has no virtual functions (including inherited virtual fns)
- * has all its data in the same access-level section (private/protected/public)
- * has no fully-contained subobjects with virtual fns
-
- If the C++ class has any base classes at all (or if any fully contained
- subobjects have base classes), accessing the data will TECHNICALLY be
- non-portable, since class layout under inheritance isn't imposed by the
- language. However in practice, all C++ compilers do it the same way: the base
- class object appears first (in left-to-right order in the event of multiple
- inheritance), and subobjects follow.
-
- Furthermore, if the class (or any base class) contains any virtual functions,
- you can often (but less than always) assume a "void*" appears in the object
- either at the location of the first virtual function or as the first word in
- the object. Again, this is not required by the language, but it is the way
- "everyone" does it.
-
- If the class has any virtual base classes, it is even more complicated and less
- portable. One common implementation technique is for objects to contain an
- object of the virtual base class (V) last (regardless of where "V" shows up as
- a virtual base class in the inheritance hierarchy). The rest of the object's
- parts appear in the normal order. Every derived class that has V as a virtual
- base class actually has a POINTER to the V part of the final object.
-
- ==============================================================================
-
- Q103: Why do I feel like I'm "further from the machine" in C++ as opposed to
- C?
-
- Because you are.
-
- As an OOPL, C++ allows you to model the problem domain itself, which allows you
- to program in the language of the problem domain rather than in the language of
- the solution domain.
-
- One of C's great strengths is the fact that it has "no hidden mechanism": what
- you see is what you get. You can read a C program and "see" every clock cycle.
- This is not the case in C++; old line C programmers (such as many of us once
- were) are often ambivalent (can anyone say, "hostile") about this feature, but
- they soon realize that it provides a level of abstraction and economy of
- expression which lowers maintenance costs without destroying run-time
- performance.
-
- Naturally you can write bad code in any language; C++ doesn't guarantee any
- particular level of quality, reusability, abstraction, or any other measure of
- "goodness." C++ doesn't try to make it impossible for bad programmers to write
- bad programs; it enables reasonable developers to create superior software.
-
- ==============================================================================
- SECTION 18: Pointers to member functions
- ==============================================================================
-
- Q104: Is the type of "ptr-to-member-fn" different from "ptr-to-fn"?
-
- Yep.
-
- Consider the following function:
-
- int f(char a, float b);
-
- If this is an ordinary function, its type is: int (*) (char,float);
- If this is a method of class Fred, its type is: int (Fred::*)(char,float);
-
- ==============================================================================
-
- Q105: How can I ensure objects of my class are always created via "new" rather
- than as locals or global/static objects?
-
- Make sure the class's constructors are "private:", and define "friend" or
- "static" fns that return a ptr to the objects created via "new" (make the
- constructors "protected:" if you want to allow derived classes).
-
- class Fred { //only want to allow dynamicly allocated Fred's
- public:
- static Fred* create() { return new Fred(); }
- static Fred* create(int i) { return new Fred(i); }
- static Fred* create(const Fred& fred) { return new Fred(fred); }
- private:
- Fred();
- Fred(int i);
- Fred(const Fred& fred);
- virtual ~Fred();
- };
-
- main()
- {
- Fred* p = Fred::create(5);
- ...
- delete p;
- }
-
- ==============================================================================
-
- Q106: How do I pass a ptr to member fn to a signal handler, X event callback,
- etc?
-
- Don't.
-
- Because a member function is meaningless without an object to invoke it on, you
- can't do this directly (if The X Windows System was rewritten in C++, it would
- probably pass references to OBJECTS around, not just pointers to fns; naturally
- the objects would embody the required function and probably a whole lot more).
-
- As a patch for existing software, use a top-level (non-member) function as a
- wrapper which takes an object obtained through some other technique (held in a
- global, perhaps). The top-level function would apply the desired member
- function against the global object.
-
- E.g., suppose you want to call Fred::memfn() on interrupt:
-
- class Fred {
- public:
- void memfn();
- static void staticmemfn(); //a static member fn can handle it
- //...
- };
-
- //wrapper fn remembers the object on which to invoke memfn in a global:
- Fred* object_which_will_handle_signal;
- void Fred_memfn_wrapper() { object_which_will_handle_signal->memfn(); }
-
- main()
- {
- /* signal(SIGINT, Fred::memfn); */ //Can NOT do this
- signal(SIGINT, Fred_memfn_wrapper); //Ok
- signal(SIGINT, Fred::staticmemfn); //Also Ok
- }
-
- Note: static member functions do not require an actual object to be invoked, so
- ptrs-to-static-member-fns are type compatible with regular ptrs-to-fns (see ARM
- p.25, 158).
-
- ==============================================================================
-
- Q107: Why am I having trouble taking the address of a C++ function?
-
- This is a corollary to the previous FAQ.
-
- Long answer: In C++, member fns have an implicit parameter which points to the
- object (the "this" ptr inside the member fn). Normal C fns can be thought of
- as having a different calling convention from member fns, so the types of their
- ptrs (ptr-to-member-fn vs ptr-to-fn) are different and incompatible. C++
- introduces a new type of ptr, called a ptr-to-member, which can only be invoked
- by providing an object (see ARM 5.5).
-
- NOTE: do NOT attempt to "cast" a ptr-to-mem-fn into a ptr-to-fn; the result is
- undefined and probably disastrous. E.g., a ptr-to- member-fn is NOT required
- to contain the machine addr of the appropriate fn (see ARM, 8.1.2c, p.158). As
- was said in the last example, if you have a ptr to a regular C fn, use either a
- top-level (non-member) fn, or a "static" (class) member fn.
-
- ==============================================================================
-
- Q108: How do I declare an array of pointers to member functions?
-
- Keep your sanity with "typedef".
-
- class Fred {
- public:
- int f(char x, float y);
- int g(char x, float y);
- int h(char x, float y);
- int i(char x, float y);
- //...
- };
-
- typedef int (Fred::*FredPtr)(char x, float y);
-
- Here's the array of pointers to member functions:
-
- FredPtr a[4] = { &Fred::f, &Fred::g, &Fred::h, &Fred::i };
-
- To call one of the member functions on object "fred":
-
- void userCode(Fred& fred, int methodNum, char x, float y)
- {
- //assume "methodNum" is between 0 and 3 inclusive
- (fred.*a[methodNum])(x, y);
- }
-
- You can make the call somewhat clearer using a #define:
-
- #define callMethod(object,ptrToMethod) ((object).*(ptrToMethod))
- callMethod(fred, a[methodNum]) (x, y);
-
- ==============================================================================
- SECTION 19: Container classes and templates
- ==============================================================================
-
- Q109: How can I insert/access/change elements from a linked
- list/hashtable/etc?
-
- I'll use an "inserting into a linked list" as a prototypical example. It's easy
- to allow insertion at the head and tail of the list, but limiting ourselves to
- these would produce a library that is too weak (a weak library is almost worse
- than no library).
-
- This answer will be a lot to swallow for novice C++'ers, so I'll give a couple
- of options. The first option is easiest; the second and third are better.
-
- [1] Empower the "List" with a "current location," and methods such as
- advance(), backup(), atEnd(), atBegin(), getCurrElem(), setCurrElem(Elem),
- insertElem(Elem), and removeElem(). Although this works in small examples, the
- notion of "a" current position makes it difficult to access elements at two or
- more positions within the List (e.g., "for all pairs x,y do the following...").
-
- [2] Remove the above methods from the List itself, and move them to a separate
- class, "ListPosition." ListPosition would act as a "current position" within a
- List. This allows multiple positions within the same List. ListPosition would
- be a friend of List, so List can hide its innards from the outside world (else
- the innards of List would have to be publicized via public methods in List).
- Note: ListPosition can use operator overloading for things like advance() and
- backup(), since operator overloading is syntactic sugar for normal methods.
-
- [3] Consider the entire iteration as an atomic event, and create a class
- template to embodies this event. This enhances performance by allowing the
- public access methods (which may be virtual fns) to be avoided during the inner
- loop. Unfortunately you get extra object code in the application, since
- templates gain speed by duplicating code. For more, see [Koenig, "Templates as
- interfaces," JOOP, 4, 5 (Sept 91)], and [Stroustrup, "The C++ Programming
- Language Second Edition," under "Comparator"].
-
- ==============================================================================
-
- Q110: What's the idea behind "templates"?
-
- A template is a cookie-cutter that specifies how to cut cookies that all look
- pretty much the same (although the cookies can be made of various kinds of
- dough, they'll all have the same basic shape). In the same way, a class
- template is a cookie cutter to description of how to build a family of classes
- that all look basically the same, and a function template describes how to
- build a family of similar looking functions.
-
- Class templates are often used to build type safe containers (although this
- only scratches the surface for how they can be used).
-
- ==============================================================================
-
- Q111: What's the syntax / semantics for a "function template"?
-
- Consider this function that swaps its two integer arguments:
-
- void swap(int& x, int& y)
- {
- int tmp = x;
- x = y;
- y = tmp;
- }
-
- If we also had to swap floats, longs, Strings, Sets, and FileSystems, we'd get
- pretty tired of coding lines that look almost identical except for the type.
- Mindless repetition is an ideal job for a computer, hence a function template:
-
- template<class T>
- void swap(T& x, T& y)
- {
- T tmp = x;
- x = y;
- y = tmp;
- }
-
- Every time we used "swap()" with a given pair of types, the compiler will go to
- the above definition and will create yet another "template function" as an
- instantiation of the above. E.g.,
-
- main()
- {
- int i,j; /*...*/ swap(i,j); //instantiates a swap for "int"
- float a,b; /*...*/ swap(a,b); //instantiates a swap for "float"
- char c,d; /*...*/ swap(c,d); //instantiates a swap for "char"
- String s,t; /*...*/ swap(s,t); //instantiates a swap for "String"
- }
-
- (note: a "template function" is the instantiation of a "function template").
-
- ==============================================================================
-
- Q112: What's the syntax / semantics for a "class template"?
-
- Consider a container class of that acts like an array of integers:
-
- //this would go into a header file such as "Array.h"
- class Array {
- public:
- Array(int len=10) : len_(len), data_(new int[len]){}
- ~Array() { delete [] data_; }
- int len() const { return len_; }
- const int& operator[](int i) const { data_[check(i)]; }
- int& operator[](int i) { data_[check(i)]; }
- Array(const Array&);
- Array& operator= (const Array&);
- private:
- int len_;
- int* data_;
- int check(int i) const
- { if (i < 0 || i >= len_) throw BoundsViol("Array", i, len_);
- return i; }
- };
-
- Just as with "swap()" above, repeating the above over and over for Array of
- float, of char, of String, of Array-of-String, etc, will become tedious.
-
- //this would go into a header file such as "Array.h"
- template<class T>
- class Array {
- public:
- Array(int len=10) : len_(len), data_(new T[len]) { }
- ~Array() { delete [] data_; }
- int len() const { return len_; }
- const T& operator[](int i) const { data_[check(i)]; }
- T& operator[](int i) { data_[check(i)]; }
- Array(const Array<T>&);
- Array& operator= (const Array<T>&);
- private:
- int len_;
- T* data_;
- int check(int i) const
- { if (i < 0 || i >= len_) throw BoundsViol("Array", i, len_);
- return i; }
- };
-
- Unlike template functions, template classes (instantiations of class templates)
- need to be explicit about the parameters over which they are instantiating:
-
- main()
- {
- Array<int> ai;
- Array<float> af;
- Array<char*> ac;
- Array<String> as;
- Array< Array<int> > aai;
- } // ^^^-- note the space; do NOT use "Array<Array<int>>"
- // (the compiler sees ">>" as a single token).
-
- ==============================================================================
-
- Q113: What is a "parameterized type"?
-
- Another way to say, "class templates."
-
- A parameterized type is a type that is parameterized over another type or some
- value. List<int> is a type ("List") parameterized over another type ("int").
-
- ==============================================================================
-
- Q114: What is "genericity"?
-
- Yet another way to say, "class templates."
-
- Not to be confused with "generality" (which just means avoiding solutions which
- are overly specific), "genericity" means class templates.
-
- ==============================================================================
- SECTION 20: Nuances of particular implementations
- ==============================================================================
-
- Q115: GNU C++ (g++) produces big executables for tiny programs; Why?
-
- libg++ (the library used by g++) was probably compiled with debug info (-g).
- On some machines, recompiling libg++ without debugging can save lots of disk
- space (~1 Meg; the down-side: you'll be unable to trace into libg++ calls).
- Merely "strip"ping the executable doesn't reclaim as much as recompiling
- without -g followed by subsequent "strip"ping the resultant "a.out"s.
-
- Use "size a.out" to see how big the program code and data segments really are,
- rather than "ls -s a.out" which includes the symbol table.
-
- ==============================================================================
-
- Q116: Is there a yacc-able C++ grammar?
-
- Jim Roskind is the author of a yacc grammar for C++. It's roughly compatible
- with the portion of the language implemented by USL cfront 2.0 (no templates,
- no exceptions, no run-time-type-identification). Jim's grammar deviates from
- C++ in a couple of minor-but-subtle ways.
-
- The grammar can be accessed by anonymous ftp from the following sites:
- * ics.uci.edu (128.195.1.1) in "gnu/c++grammar2.0.tar.Z".
- * mach1.npac.syr.edu (128.230.7.14) in "pub/C++/c++grammar2.0.tar.Z".
-
- ==============================================================================
-
- Q117: What is C++ 1.2? 2.0? 2.1? 3.0?
-
- These are not versions of the language, but rather versions of cfront, which
- was the original C++ translator implemented by AT&T. It has become generally
- accepted to use these version numbers as if they were versions of the language
- itself.
-
- *VERY* roughly speaking, these are the major features:
- * 2.0 includes multiple/virtual inheritance and pure virtual functions.
- * 2.1 includes semi-nested classes and "delete [] ptr_to_array."
- * 3.0 includes fully-nested classes, templates and "i++" vs "++i."
- * 4.0 will include exceptions.
-
- ==============================================================================
- SECTION 21: Miscellaneous technical and environmental issues
- ==============================================================================
- SUBSECTION 21A: Miscellaneous technical issues:
- ==============================================================================
-
- Q118: Why are classes with static data members getting linker errors?
-
- Static data members must be explicitly defined in exactly one module. E.g.,
-
- class Fred {
- public:
- //...
- private:
- static int i_; //declares static data member "Fred::i_"
- //...
- };
-
- The linker will holler at you ("Fred::i_ is not defined") unless you define (as
- opposed to declare) "Fred::i_" in (exactly) one of your source files:
-
- int Fred::i_ = some_expression_evaluating_to_an_int;
- or:
- int Fred::i_;
-
- The usual place to define static data members of class "Fred" is file "Fred.C"
- (or "Fred.cpp", etc; whatever filename extension you use).
-
- ==============================================================================
-
- Q119: What's the difference between the keywords struct and class?
-
- The members and base classes of a struct are public by default, while in class,
- they default to private. Note: you should make your base classes EXPLICITLY
- public, private, or protected, rather than relying on the defaults.
-
- "struct" and "class" are otherwise functionally equivalent.
-
- ==============================================================================
-
- Q120: Why can't I overload a function by its return type?
-
- If you declare both "char f()" and "float f()", the compiler gives you an error
- message, since calling simply "f()" would be ambiguous.
-
- ==============================================================================
-
- Q121: What is "persistence"? What is a "persistent object"?
-
- A persistent object can live after the program which created it has stopped.
- Persistent objects can even outlive different versions of the creating program,
- can outlive the disk system, the operating system, or even the hardware on
- which the OS was running when they were created.
-
- The challenge with persistent objects is to effectively store their method code
- out on secondary storage along with their data bits (and the data bits and
- method code of all member objects, and of all their member objects and base
- classes, etc). This is non-trivial when you have to do it yourself. In C++,
- you have to do it yourself. C++/OO databases can help hide the mechanism for
- all this.
-
- ==============================================================================
- SUBSECTION 21B: Miscellaneous environmental issues:
- ==============================================================================
-
- Q122: Is there a TeX or LaTeX macro that fixes the spacing on "C++"?
-
- Yes, here are two:
-
- \def\CC{C\raise.22ex\hbox{{\footnotesize +}}\raise.22ex\hbox{\footnotesize +}}
-
- \def\CC{{C\hspace{-.05em}\raisebox{.4ex}{\tiny\bf ++}}}
-
- ==============================================================================
-
- Q123: Where can I access C++2LaTeX, a LaTeX pretty printer for C++ source?
-
- Here are a few ftp locations:
-
- Host aix370.rrz.uni-koeln.de (134.95.80.1) Last updated 15:41 26 Apr 1991
- Location: /tex
- FILE rw-rw-r-- 59855 May 5 1990 C++2LaTeX-1.1.tar.Z
- Host utsun.s.u-tokyo.ac.jp (133.11.11.11) Last updated 05:06 20 Apr 1991
- Location: /TeX/macros
- FILE rw-r--r-- 59855 Mar 4 08:16 C++2LaTeX-1.1.tar.Z
- Host nuri.inria.fr (128.93.1.26) Last updated 05:23 9 Apr 1991
- Location: /TeX/tools
- FILE rw-rw-r-- 59855 Oct 23 16:05 C++2LaTeX-1.1.tar.Z
- Host iamsun.unibe.ch (130.92.64.10) Last updated 05:06 4 Apr 1991
- Location: /TeX
- FILE rw-r--r-- 59855 Apr 25 1990 C++2LaTeX-1.1.tar.Z
- Host iamsun.unibe.ch (130.92.64.10) Last updated 05:06 4 Apr 1991
- Location: /TeX
- FILE rw-r--r-- 51737 Apr 30 1990
- C++2LaTeX-1.1-PL1.tar.Z
- Host tupac-amaru.informatik.rwth-aachen.de (192.35.229.9) Last updated 05:07 18 Apr 1991
- Location: /pub/textproc/TeX
- FILE rw-r--r-- 72957 Oct 25 13:51 C++2LaTeX-1.1-PL4.tar.Z
- Host wuarchive.wustl.edu (128.252.135.4) Last updated 23:25 30 Apr 1991
- Location: /packages/tex/tex/192.35.229.9/textproc/TeX
- FILE rw-rw-r-- 49104 Apr 10 1990 C++2LaTeX-PL2.tar.Z
- FILE rw-rw-r-- 25835 Apr 10 1990 C++2LaTeX.tar.Z
- Host tupac-amaru.informatik.rwth-aachen.de (192.35.229.9) Last updated 05:07 18 Apr 1991
- Location: /pub/textproc/TeX
- FILE rw-r--r-- 74015 Mar 22 16:23 C++2LaTeX-1.1-PL5.tar.Z
- Location: /pub
- FILE rw-r--r-- 74015 Mar 22 16:23 C++2LaTeX-1.1-PL5.tar.Z
- Host sol.cs.ruu.nl (131.211.80.5) Last updated 05:10 15 Apr 1991
- Location: /TEX/TOOLS
- FILE rw-r--r-- 74015 Apr 4 21:02x C++2LaTeX-1.1-PL5.tar.Z
- Host tupac-amaru.informatik.rwth-aachen.de (192.35.229.9) Last updated 05:07 18 Apr 1991
- Location: /pub/textproc/TeX
- FILE rw-r--r-- 4792 Sep 11 1990 C++2LaTeX-1.1-patch#1
- FILE rw-r--r-- 2385 Sep 11 1990 C++2LaTeX-1.1-patch#2
- FILE rw-r--r-- 5069 Sep 11 1990 C++2LaTeX-1.1-patch#3
- FILE rw-r--r-- 1587 Oct 25 13:58 C++2LaTeX-1.1-patch#4
- FILE rw-r--r-- 8869 Mar 22 16:23 C++2LaTeX-1.1-patch#5
- FILE rw-r--r-- 1869 Mar 22 16:23 C++2LaTeX.README
- Host rusmv1.rus.uni-stuttgart.de (129.69.1.12) Last updated 05:13 13 Apr 1991
- Location: /soft/tex/utilities
- FILE rw-rw-r-- 163840 Jul 16 1990 C++2LaTeX-1.1.tar
-
- ==============================================================================
-
- Q124: Where can I access "tgrind," a pretty printer for C++/C/etc source?
-
- "tgrind" reads a C++ source file, and spits out something that looks pretty on
- most Unix printers. It usually comes with the public distribution of TeX and
- LaTeX; look in the directory: "...tex82/contrib/van/tgrind". A more up-to-date
- version of tgrind by Jerry Leichter can be found on: venus.ycc.yale.edu in
- [.TGRIND].
-
- ==============================================================================
-
- Q125: Is there a C++-mode for GNU emacs? If so, where can I get it?
-
- Yes, there is a C++-mode for GNU emacs. You can get it via:
-
- c++-mode-2 (1.0) 87-12-08
- Bruce Eckel,Thomas Keffer, <eckel@beluga.ocean.washington.edu,uw-beaver!beluga!eckel,keffer@sperm.ocean.washington.edu>
- archive.cis.ohio-state.edu:/pub/gnu/emacs/elisp-archive/as-is/c++-mode-2.el.Z
-
- Another C++ major mode.
- c++-mode 89-11-07
- Dave Detlefs, et al, <dld@cs.cmu.edu>
- archive.cis.ohio-state.edu:/pub/gnu/emacs/elisp-archive/modes/c++-mode.el.Z
-
- C++ major mode.
- c++ 90-02-01
- David Detlefs, Stewart Clamen, <dld@f.gp.cs.cmu.edu,clamen@cs.cmu.edu>
- archive.cis.ohio-state.edu:/pub/gnu/emacs/elisp-archive/modes/c++.el.Z
- C++ code editing commands for Emacs
-
- c-support (46) 89-11-04
- Lynn Slater, <lrs@indetech.com>
- archive.cis.ohio-state.edu:/pub/gnu/emacs/elisp-archive/misc/c-support.el.Z
- Partial support for team C/C++ development.
-
- ==============================================================================
-
- Q126: Where can I get OS-specific FAQs answered (e.g.,BC++,DOS,Windows,etc)?
-
- see comp.os.msdos.programmer, BC++ and Zortech mailing lists, BC++ and
- Zortech bug lists, comp.windows.ms.programmer, comp.unix.programmer, etc.
-
- You can subscribe to the BC++ mailing list by sending email to:
- | To: listserv@ucf1vm.cc.ucf.edu <---or LISTSERV@UCF1VM.BITNET
- | Subject: SUB TCPLUS-L
- | Reply-to: you@your.email.addr <---i.e., put your return address here
-
- The BC++ bug report is available via anonymous ftp from sun.soe.clarkson.edu
- [128.153.12.3] from the file ~ftp/pub/Turbo-C++/bug-report
- (also, I post it on comp.lang.c++ on the first each month).
-
- Relevant email addresses:
- ztc-list@zortech.com General requests and discussion
- ztc-list-request@zortech.com Requests to be added to ztc-list
- ztc-bugs@zortech.com For _short_ bug reports
-
- ==============================================================================
-
- Q127: Why does my DOS C++ program says "Sorry: floating point code not
- linked"?
-
- The compiler attempts to save space in the executable by not including the
- float-to-string format conversion routines unless they are necessary, but
- sometimes it guesses wrong, and gives you the above error message. You can fix
- this by (1) using <iostream.h> instead of <stdio.h>, or (2) by including the
- following function somewhere in your compilation (but don't call it!):
-
- static void dummyfloat(float *x) { float y; dummyfloat(&y); }
-
- See FAQ on stream I/O for more reasons to use <iostream.h> vs <stdio.h>.
-
- ==============================================================================
-
- --
- Marshall Cline
- --
- Marshall P. Cline, Ph.D. / Paradigm Shift Inc / PO Box 5108 / Potsdam NY 13676
- cline@sun.soe.clarkson.edu / 315-353-6100 / FAX: 315-353-6110
-